package net.servir.capacidades.dao.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.capacidades.dao.DemoDao;
import net.servir.capacidades.model.Indicacion;
import net.servir.capacidades.model.Instructivo;
import net.servir.capacidades.model.Parametro;
import net.servir.capacidades.model.PruebaInstructivo;
import net.servir.capacidades.model.Sistema;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcDemoDao implements DemoDao {

	private SimpleJdbcTemplate jdbcTemplate;
	
	private ResultSetExtractor sistemaExtractor = new SistemaExtractor();

	@Autowired
	public JdbcDemoDao(DataSource dataSource){
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public Parametro buscarParametroxNombre(Parametro parametro)throws DataAccessException {
		/*Map<String,Object> map = new HashMap<String,Object>();
		IbatisUtils.fillMap(parametro, "", map);;
		().queryForObject("buscarParametroxNombre", map);
		devuelveResultados(parametro, map);
		List<Parametro> list = (List<Parametro>) map.get("resultado");
		if(list!=null && list.size()>0)
			return list.get(0);*/
		
		
		
		Parametro param = null;
		
		String sql="select id_parametro, c_nombre_parametro, c_desc_parametro " +
		" from tab_parametro where c_nombre_parametro like '"+ parametro.getNombre()+"'";
		
		List<Map<String, Object>> lParametroMaps = jdbcTemplate.queryForList(sql);
				
		for (Map<String, Object> obj : lParametroMaps) {
			param = new Parametro();
			param.setCodigo((Number)obj.get("id_parametro"));
			param.setNombre((String)obj.get("c_nombre_parametro"));
			param.setDescripcion((String)obj.get("c_desc_parametro"));			
		}
		return param;
		
	
		
	}
			
		
	public List ListaInstructivo(String cod_sistema)
	{
		List lstIntructivo = null;
		
		String sql="select id_cab_instructivo, nombre_instruc, secuencia " +
				" from cab_instructivo where id_sistema like '"+cod_sistema+ "'"+" order by secuencia";		
		
		List<Map<String, Object>> lInstructivoMaps = jdbcTemplate.queryForList(sql);
		
		for(Map<String, Object> obj : lInstructivoMaps){
			Instructivo i = new Instructivo();
			i.setId_cab_instructivo((Number)obj.get("id_cab_instructivo"));
			i.setDescripcion((String)obj.get("nombre_instruc"));
			i.setSecuencia((Number)obj.get("secuencia"));
			
			if (lstIntructivo == null) lstIntructivo = new ArrayList();
			lstIntructivo.add(i);			
			i = null;			
		}
		return lstIntructivo;			
	}
	
	public List listaInstructivo_Indicaciones(String codigo)
	{
		List lstIndicaciones = null;
		
		String sql="select id_det_instructivo, id_cab_instructivo, nombre_detalle , secuencia" +
				" from det_instructivo where id_cab_instructivo like '"+codigo+ "'"+" order by secuencia";		
		
		List<Map<String, Object>> lIndicacionesMaps = jdbcTemplate.queryForList(sql);
		
		for(Map<String, Object> obj : lIndicacionesMaps){
			Indicacion indicacion = new Indicacion();
			indicacion.setId_det_instructivo((Number)obj.get("id_det_instructivo"));
			indicacion.setId_cab_instructivo((Number)obj.get("id_cab_instructivo")) ;
			indicacion.setNombre_detalle((String)obj.get("nombre_detalle"));	
			indicacion.setSecuencia((Number)obj.get("secuencia")) ;
			
			if (lstIndicaciones == null) lstIndicaciones = new ArrayList();
			lstIndicaciones.add(indicacion);			
			indicacion = null;			
		}
		return lstIndicaciones;			
	}
	
	
	public PruebaInstructivo listaAlternativas_Pregunta(String secuencia, String cod_sistema)
	{
		PruebaInstructivo prueba = null;
		
		String sql="select id_prueba_instructivo,nro_pregunta, pregunta, alternativa_1, alternativa_2, alternativa_3, alternativa_4, alternativa_5 " +
		" from prueba_instructivo where nro_pregunta like '"+ secuencia+"'"+" and id_sistema like '"+cod_sistema+"'";
		
		List<Map<String, Object>> lPruebaMaps = jdbcTemplate.queryForList(sql);
				
		for (Map<String, Object> obj : lPruebaMaps) {
			prueba = new PruebaInstructivo();
			prueba.setId_prueba_instructivo((Number)obj.get("id_prueba_instructivo"));
			prueba.setNro_pregunta((Number)obj.get("nro_pregunta")) ;
			prueba.setPregunta((String)obj.get("pregunta")) ;
			prueba.setAlternativa1((String)obj.get("alternativa_1"));
			prueba.setAlternativa2((String)obj.get("alternativa_2"));
			prueba.setAlternativa3((String)obj.get("alternativa_3"));
			prueba.setAlternativa4((String)obj.get("alternativa_4"));
			prueba.setAlternativa5((String)obj.get("alternativa_5"));
					
		}
		return prueba;
		
	}
	
	//*************** TITULO DE DIAGNOSTICO**************
	
	public Sistema buscarSistema(String cod_sistema)
	{
		String sql="select id_sistema, upper(descripcion)as sistema, acronimo from sistema " +
			"where id_sistema = ?" ;
		return (Sistema) jdbcTemplate.getJdbcOperations().query(sql, new Object[]{cod_sistema}, sistemaExtractor);
	}
	
	private class SistemaExtractor implements ResultSetExtractor {
		public Object extractData(ResultSet rs) throws SQLException,
				DataAccessException {			
			return mapSistema(rs);
		}
	}			
	private Sistema mapSistema(ResultSet rs) throws SQLException{
		Sistema sistema = null;
		while(rs.next()){
			if(sistema==null){
				sistema = new Sistema();
				sistema.setId_sistema(rs.getInt("id_sistema"));
				sistema.setSistema(rs.getString("sistema"));
				sistema.setAcronimo(rs.getString("acronimo"));
			}
			//otras tablas
		}
		if(sistema==null){
			//throw new EmptyResultDataAccessException(1);
		}
		return sistema;
	}
	//***************************************************
	
}
